<?php
/**
 * Form_Fields
 *
 * класс Form_Fields позволяет работать с наборами полей
 * @author Дмитрий Кузьма <kouzma.d@gmail.com>
 * @version 2.1
 */

class Form_Fields {
  protected $_objAR;

  protected $_objARName;
  protected $_arrModelNames = array();
  protected $_class = null;
  protected $_method = 'post';
  protected $_style;
  protected $_js;
  protected $_errorIfExists = true;

  public function __construct($arrSettings = null, $objAR = null) {

  	if ($arrSettings) foreach ($arrSettings as $settingName => $settingValue) {
  		$this->setSetting($settingName, $settingValue);
  	}
  	if (isset($objAR)) {
  		$this->setSetting('objAR', $objAR);
  		if (isset($arrSettings['collection']))
  		  $this->setModelName($arrSettings['collection']);
  	}
  }

	/**
	 * Метод устанавливает свойство
	 *
	 * @param string $settingName
	 * @param mixed $settingValue
	 */
	public function setSetting($settingName, $settingValue, $additionalAllowedSettings = null) {
    switch ($settingName) {
    	case 'objARName':
    		$this->setObjARName($settingValue);
    		$this->setModelName($settingValue);
    		break;
    	case 'modelNames':
    		$this->setModelNames($settingValue);
    		break;
    	case 'objAR':
    		$this->setObjARName(get_class($settingValue));
    		$this->setModelName(get_class($settingValue));
    		$this->setObjAR($settingValue);
    		break;
    	case 'class':
    		$this->setClass($settingValue);
    		break;
    	case 'method':
    		$this->setMethod($settingValue);
    		break;
    	case 'style':
    		$this->setStyle($settingValue);
    		break;
    	case 'js':
    		$this->setJs($settingValue);
    		break;
    	case 'errorIfExists':
    		$this->_errorIfExists = $settingValue;
    		break;
    	case 'collection':
    		break;
    	default:
    	  throw new Exception('You try to use invalid configuration. The assume settings are: "collection", "errorIfExists", "objARName", "objAR", "class", "method", "style", "js"' . ($additionalAllowedSettings ? ', ' . $additionalAllowedSettings : null));
			  break;
    }
  }


	/**
	 * Устанавливает имя можели, с которой работает набор полей
	 *
	 * @param string $objARName
	 */
	private function setObjARName($objARName) {
		$this->_objARName = $objARName;
	}
	/**
	 * Заполняет массив названий моделей
	 *
	 * @param string $objARName
	 */
	private function setModelName($objARName) {
		$this->_arrModelNames[] = $objARName;
	}
	/**
	 * Устанавливает массив моделей
	 *
	 * @param array $modelNames
	 */
	private function setModelNames($modelNames) {
		$this->_arrModelNames = $modelNames;
	}
	/**
	 * Возвращает массив моделей
	 *
	 * @return array
	 */
	public function getArrModelNames() {
		return $this->_arrModelNames;
	}
	/**
	 * Устанавливает объект, с которым работает форма
	 *
	 * @param string $objAR
	 */
	private function setObjAR($objAR) {
		$this->_objAR = $objAR;
	}
	/**
	 * Устанавливает класс html-формы
	 *
	 * @param string $class
	 */
	private function setClass($class) {
		$this->_class = $class;
	}
	/**
	 * Устанавливает метод отправки данных
	 *
	 * @param string $method
	 */
	private function setMethod($method) {
		$this->_method = $method;
	}
	/**
	 * Устанавливает стили
	 *
	 * @param string $style
	 */
	private function setStyle($style) {
		$this->_style = $style;
	}
	/**
	 * Устанавливает js-код
	 *
	 * @param string $js
	 */
	private function setJs($js) {
		$this->_js = $js;
	}


	/**
	 * Получает массив из POST/GET массива свойственный данной модели
	 *
	 * @return unknown
	 */
	public function getModelArray() {
		if ($this->_method == 'post') {
			if (!$_POST)
			  if ($this->_objAR)
			    return $this->_objAR->tableFields;
			$retArr = &$_POST;
		}
		else {
			if (!$_GET)
			 if ($this->_objAR)
			   return $this->_objAR->tableFields;
			$retArr = &$_GET;
		}

		$modelsSize = sizeof($this->_arrModelNames);
		for ($i = 0; $i < $modelsSize; $i++) {
		  $retArr = &$retArr[$this->_arrModelNames[$i]];
		}
		return $retArr;

		return ;
	}

	public function getFieldValue($fieldName) {
		$modelArr = $this->getModelArray();
		if ($modelArr) {
			return isset($modelArr[$fieldName]) ? $modelArr[$fieldName] : null;
		}
	}

	/**
	 * Формирует и выводит текстовый элемент ввода
	 *
	 * @param array $arrSettings
	 */
	public function textField(array $arrSettings = array(), $fieldName = null) {
		if (!isset($arrSettings['value'])) {

			$modelArr = $this->getModelArray();
			if ($modelArr) {
			  $arrSettings['value'] = (isset($modelArr[$fieldName]) ? $modelArr[$fieldName] : NULL);
			}
		}
		$arrSettings['modelNames'] = $this->_arrModelNames;

		$objTextField = new Form_Text($arrSettings, $fieldName);
		$objTextField->show();
	}
	/**
	 * Формирует и выводит элемент select
	 *
	 * @param array $arrSettings
	 */
	public function selectField(array $arrSettings = array(), $fieldName = null) {
		if (!isset($arrSettings['value'])) {

			$modelArr = $this->getModelArray();

			if ($modelArr)
			  $arrSettings['value'] = isset($modelArr[$fieldName]) ? $modelArr[$fieldName] : null;
		}
		$arrSettings['modelNames'] = $this->_arrModelNames;

		$objSelectField = new Form_Select($arrSettings, $fieldName);
		$objSelectField->show();
	}
	/**
	 * Формирует и выводит элемент ода файла
	 *
	 * @param array $arrSettings
	 */
	public function fileField(array $arrSettings = array(), $fieldName = null) {
		if (!isset($arrSettings['value'])) {

			$modelArr = $this->getModelArray();

			if ($modelArr)
			  $arrSettings['value'] = isset($modelArr[$fieldName]) ? $modelArr[$fieldName] : null;
		}
		$arrSettings['modelNames'] = $this->_arrModelNames;

		$objFileField = new Form_File($arrSettings, $fieldName);
		$objFileField->show();
	}
	/**
	 * Формирует и выводит элемент textarea
	 *
	 * @param array $arrSettings
	 */
	public function textareaField(array $arrSettings = array(), $fieldName = null) {
		if (!isset($arrSettings['value'])) {

			$modelArr = $this->getModelArray();

			if ($modelArr)
			  $arrSettings['value'] = isset($modelArr[$fieldName]) ? $modelArr[$fieldName] : null;
		}
		$arrSettings['modelNames'] = $this->_arrModelNames;

		$objTextareaField = new Form_Textarea($arrSettings, $fieldName);
		$objTextareaField->show();
	}
	/**
	 * Формирует и выводит элемент textarea
	 *
	 * @param array $arrSettings
	 */
	public function wysiwygField(array $arrSettings = array(), $fieldName = null) {
		if (!isset($arrSettings['value'])) {

			$modelArr = $this->getModelArray();

			if ($modelArr)
			  $arrSettings['value'] = isset($modelArr[$fieldName]) ? $modelArr[$fieldName] : null;
		}
		$arrSettings['modelNames'] = $this->_arrModelNames;

		$objWysiwygField = new Form_Wysiwyg($arrSettings, $fieldName);
		$objWysiwygField->show();
	}
	/**
	 * Формирует и выводит скрытый элемент
	 *
	 * @param array $arrSettings
	 */
	public function hiddenField(array $arrSettings = array(), $fieldName = null) {
		if (!isset($arrSettings['value'])) {
			$modelArr = $this->getModelArray();
			if ($modelArr) {
				$arrSettings['value'] = isset($modelArr[$fieldName]) ? $modelArr[$fieldName] : null;
			}

		}
		$arrSettings['modelNames'] = $this->_arrModelNames;

		$objHiddenField = new Form_Hidden($arrSettings, $fieldName);
		$objHiddenField->show();
	}
	/**
	 * Формирует и выводит чекбокс
	 *
	 * @param array $arrSettings
	 */
	public function checkbox(array $arrSettings = array(), $fieldName = null) {
	  if (!isset($arrSettings['value'])) {
	    $modelArr = $this->getModelArray();
			if ($modelArr) {
			  $arrSettings['value'] = isset($modelArr[$fieldName]) ? $modelArr[$fieldName] : null;
			}
		}
		$arrSettings['modelNames'] = $this->_arrModelNames;
		$objCheckbox = new Form_Checkbox($arrSettings, $fieldName);
		$objCheckbox->show();
	}
	/**
	 * Формирует и выводит текстовый элемент ввода пароля
	 *
	 * @param array $arrSettings
	 */
	public function passwordField(array $arrSettings = array(), $fieldName = null) {
		if (!isset($arrSettings['value'])) {
			$modelArr = $this->getModelArray();
			if ($modelArr)
			  $arrSettings['value'] = isset($modelArr[$fieldName]) ? $modelArr[$fieldName] : null;
		}
		$arrSettings['modelNames'] = $this->_arrModelNames;
		$objPasswordField = new Form_Password($arrSettings, $fieldName);
		$objPasswordField->show();
	}

	/**
	 * Формирует и выводит кнопку submit
	 *
	 * @param array $arrSettings
	 */
	public function submitButton(array $arrSettings = array(), $fieldName = null) {
		$arrSettings['modelNames'] = $this->_arrModelNames;
		$objSubmitButton = new Form_Submit($arrSettings, $fieldName);
		$objSubmitButton->show();
	}

	/**
	 * Формирует набор полей
	 *
	 * @param array $arrSettings
	 */
	public function formFields($arrSettings = array(), $objAR = null) {
		//if (!isset($arrSettings['action'])) $arrSettings['action'] = $this->_action;

		$arrSettings['modelNames'] = $this->_arrModelNames;
		$objFormFields = new Form_Fields($arrSettings, $objAR);
		return $objFormFields;
	}
	/**
	 * Выводит троковую ошибку, если таковая существует
	 *
	 */
	public function showRowErrorIfExists() {
		$modelsSize = sizeof($this->_arrModelNames);
		$arrModelExceptions = Exception_ActiveRecord::getArrExceptionOfModel($this->_arrModelNames[0]);
		if ($arrModelExceptions) for ($i = 1; $i < $modelsSize; $i++) {
			if (isset($arrModelExceptions[$this->_arrModelNames[$i]]))
			  $arrModelExceptions = &$arrModelExceptions[$this->_arrModelNames[$i]];
			else return false;
		}
		else return false;
		echo '<img src="' . W_IMAGES . 'icons/error.gif"  class="errOrCor" alt="" title="' . $arrModelExceptions . '" />';
	}

}